



<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Do not use if/else to switch &mdash; Python Anti-Patterns  documentation</title>
  

  
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="../_static/css/ribbon.css" type="text/css" />
  
    <link rel="stylesheet" href="../_static/css/font-awesome-4.1.0/css/font-awesome.min.css" type="text/css" />
  
    <link rel="stylesheet" href="../_static/css/menu.css" type="text/css" />
  
        <link rel="index" title="Index"
              href="../genindex.html"/>
        <link rel="search" title="Search" href="../search.html"/>
    <link rel="top" title="Python Anti-Patterns  documentation" href="../index.html"/> 

</head>

<body class="wy-body-for-nav" role="document">

  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        <a href="../index.html"> Python Anti-Patterns</a>
        <div role="search">
  <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>
      </div>


      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
        
            <ul>
<li class="toctree-l1"><a class="reference internal" href="../correctness/index.html"><i class="fa fa-check"></i> Correctness</a></li>
<li class="toctree-l1"><a class="reference internal" href="../maintainability/index.html"><i class="fa fa-puzzle-piece"></i> Maintainability</a></li>
<li class="toctree-l1"><a class="reference internal" href="index.html"><i class="fa fa-eye"></i> Readability</a></li>
<li class="toctree-l1"><a class="reference internal" href="../security/index.html"><i class="fa fa-lock"></i> Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../performance/index.html"><i class="fa fa-dashboard"></i> Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="../django/index.html"><i class="fa fa-book"></i> Django</a></li>
</ul>

        
      </div>
      &nbsp;

    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="../index.html">Python Anti-Patterns</a>
      </nav>


      
      <div class="wy-nav-content" id="signup-box" >
        <div class="rst-content">
          <div class="navigation" role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
    <li><a href="../index.html">Documentation</a> &raquo;</li>
      
    <li>Do not use if/else to switch</li>
      <li class="wy-breadcrumbs-aside">
        
          <a href="../_sources/readability/not_using_if_to_switch.rst.txt" rel="nofollow"> View page source</a>
        
      </li>
  </ul>
  <hr/>
</div>

          <div role="main">
            
  <div class="section" id="do-not-use-if-else-to-switch">
<h1>Do not use if/else to switch<a class="headerlink" href="#do-not-use-if-else-to-switch" title="Permalink to this headline">¶</a></h1>
<p>Python doesn’t have the <code class="docutils literal notranslate"><span class="pre">switch</span></code> statement like Java or C, so sometimes it’s common to find
code like this:</p>
<div class="section" id="anti-pattern">
<h2>Anti-Pattern<a class="headerlink" href="#anti-pattern" title="Permalink to this headline">¶</a></h2>
<p>def calculate_with_operator(operator, a, b):</p>
<blockquote>
<div><dl class="simple">
<dt>if operator == ‘+’:</dt><dd><p>return a+b</p>
</dd>
<dt>elif operator == ‘-‘:</dt><dd><p>return a-b</p>
</dd>
<dt>elif operator == ‘/’:</dt><dd><p>return a/b</p>
</dd>
<dt>elif operator == ‘*’:</dt><dd><p>return a*b</p>
</dd>
</dl>
</div></blockquote>
<p>This is hard to read if the chain of if/else is too long, furthermore it takes a lot of lines
and the program will check a lot of times if the functions was called with the operator “*”.</p>
</div>
<div class="section" id="best-practice">
<h2>Best Practice<a class="headerlink" href="#best-practice" title="Permalink to this headline">¶</a></h2>
<div class="section" id="use-a-dictionary-to-do-it">
<h3>Use a dictionary to do it<a class="headerlink" href="#use-a-dictionary-to-do-it" title="Permalink to this headline">¶</a></h3>
<p>def calculate_with_operator(operator, a, b):</p>
<blockquote>
<div><dl class="simple">
<dt>possible_operators = {</dt><dd><p>‘+’: lambda a,b: a+b,
‘-‘: lambda a,b: a-b,
‘*’: lambda a,b: a*b,
‘/’: lambda a,b: a/b</p>
</dd>
</dl>
<p>}</p>
<p>return possible_operators[operator](a,b)</p>
</div></blockquote>
<p>This is faster and easier to read.
It should be noted that the lambda functions are necessary here to increase performance.
Without them the method returns the correct result but it will evaluate every value of the dictionary regardless of the given operator
In this case the difference in speed will be barely noticeable but can become critical if some more elaborate equations need to be solved.</p>
</div>
</div>
</div>


          </div>
          <footer>
  

  <hr/>

  <div role="contentinfo">
    <p>
    </p>
  </div>

    <!--End mc_embed_signup-->
  <a href="https://github.com/snide/sphinx_rtd_theme">Sphinx theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a> - Last updated: Sep 29, 2020 
</footer>
        </div>
      </div>

    </section>


  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'../',
            VERSION:'',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="../_static/jquery.js"></script>
      <script type="text/javascript" src="../_static/underscore.js"></script>
      <script type="text/javascript" src="../_static/doctools.js"></script>
      <script type="text/javascript" src="../_static/language_data.js"></script>

  

  
  
    <script type="text/javascript" src="../_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
   

  <!-- Place this tag right after the last button or just before your close body tag. -->
  <script async defer id="github-bjs" src="https://buttons.github.io/buttons.js"></script>

</body>
</html>